home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C / Applications / Newswatcher 2.0b22 / NW Source / Source / resutil.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-09-27  |  8.9 KB  |  383 lines  |  [TEXT/MMCC]

  1. /*----------------------------------------------------------------------------
  2.  
  3.     resutil.c
  4.  
  5.     This reusable module contains miscellaneous Resource Manager utility routines.
  6.     
  7.     Copyright © 1994, Northwestern University.
  8.  
  9. ----------------------------------------------------------------------------*/
  10.  
  11. #include "resutil.h"
  12. #include "memutil.h"
  13. #include "strutil.h"
  14. #include "fileutil.h"
  15.  
  16.  
  17.  
  18. /*----------------------------------------------------------------------------
  19.     MyFSpOpenResFile 
  20.     
  21.     Open a resource file.
  22.             
  23.     Entry:    fSpec = pointer to file spec.
  24.             permission = open permissions.
  25.     
  26.     Exit:    function result = error code.
  27.             *refNum = reference number of opened file.
  28. ----------------------------------------------------------------------------*/
  29.  
  30. OSErr MyFSpOpenResFile (FSSpec *fSpec, SignedByte permission, short *refNum)
  31. {
  32.     short fRefNum;
  33.     OSErr err = noErr;
  34.  
  35.     fRefNum = FSpOpenResFile(fSpec, permission);
  36.     err = ResError();
  37.     if (err != noErr) return err;
  38.     *refNum = fRefNum;
  39.     return noErr;
  40. }
  41.  
  42.  
  43.  
  44. /*----------------------------------------------------------------------------
  45.     MyFSpCreateResFile 
  46.     
  47.     Create a resource file.
  48.             
  49.     Entry:    fSpec = pointer to file spec.
  50.             creator = creator code.
  51.             fileType = file type.
  52.             scriptTag = script code.
  53.     
  54.     Exit:    function result = error code.
  55.             *refNum = reference number of opened file.
  56. ----------------------------------------------------------------------------*/
  57.  
  58. OSErr MyFSpCreateResFile (FSSpec *fSpec, OSType creator, OSType fileType,
  59.     ScriptCode scriptTag)
  60. {
  61.     FSpCreateResFile(fSpec, creator, fileType, scriptTag);
  62.     return ResError();
  63. }
  64.  
  65.  
  66.  
  67. /*----------------------------------------------------------------------------
  68.     OpenResFileWriteCreateIfMissing 
  69.     
  70.     Open a resource file for writing. Create the file if it doesn't exist.
  71.             
  72.     Entry:    fSpec = pointer to file spec.
  73.             creator = creator code.
  74.             fileType = file type.
  75.             scriptTag = script code.
  76.     
  77.     Exit:    function result = error code.
  78.             *refNum = reference number of opened file.
  79. ----------------------------------------------------------------------------*/
  80.  
  81. OSErr OpenResFileWriteCreateIfMissing (FSSpec *fSpec, OSType creator, OSType fileType,
  82.     ScriptCode scriptTag, short *refNum)
  83. {
  84.     short fRefNum = 0;
  85.     OSErr err = noErr;
  86.     
  87.     err = MyFSpOpenResFile(fSpec, fsRdWrPerm, &fRefNum);
  88.     if (err == fnfErr || err == eofErr) {
  89.         err = MyFSpCreateResFile(fSpec, creator, fileType, scriptTag);
  90.         if (err != noErr) return err;
  91.         err = MyFSpOpenResFile(fSpec, fsRdWrPerm, &fRefNum);
  92.         if (err != noErr) return err;
  93.     } else if (err != noErr) {
  94.         return err;
  95.     }
  96.     *refNum = fRefNum;
  97.     return noErr;
  98. }
  99.  
  100.  
  101.  
  102. /*----------------------------------------------------------------------------
  103.     MyGetResource 
  104.     
  105.     Get a resource.
  106.             
  107.     Entry:    rType = resource type.
  108.             rID = resource id.
  109.     
  110.     Exit:    function result = error code.
  111.             *theHandle = handle to resource.
  112. ----------------------------------------------------------------------------*/
  113.  
  114. OSErr MyGetResource (OSType rType, short rID, void *theHandle)
  115. {
  116.     Handle h;
  117.     OSErr err = noErr;
  118.     
  119.     h = GetResource(rType, rID);
  120.     err = ResError();
  121.     if (err != noErr) return err;
  122.     if (h == nil) return resNotFound;
  123.     *(void**)theHandle = h;
  124.     return noErr;
  125. }
  126.  
  127.  
  128.  
  129. /*----------------------------------------------------------------------------
  130.     MyGet1Resource 
  131.     
  132.     Get a resource.
  133.             
  134.     Entry:    rType = resource type.
  135.             rID = resource id.
  136.     
  137.     Exit:    function result = error code.
  138.             *theHandle = handle to resource.
  139. ----------------------------------------------------------------------------*/
  140.  
  141. OSErr MyGet1Resource (OSType rType, short rID, void *theHandle)
  142. {
  143.     Handle h;
  144.     OSErr err = noErr;
  145.     
  146.     h = Get1Resource(rType, rID);
  147.     err = ResError();
  148.     if (err != noErr) return err;
  149.     if (h == nil) return resNotFound;
  150.     *(void**)theHandle = h;
  151.     return noErr;
  152. }
  153.  
  154.  
  155.  
  156. /*----------------------------------------------------------------------------
  157.     MyGet1IndResource 
  158.     
  159.     Get an indexed resource.
  160.             
  161.     Entry:    rType = resource type.
  162.             index = resource index.
  163.     
  164.     Exit:    function result = error code.
  165.             *theHandle = handle to resource.
  166. ----------------------------------------------------------------------------*/
  167.  
  168. OSErr MyGet1IndResource (OSType rType, short index, void *theHandle)
  169. {
  170.     Handle h;
  171.     OSErr err = noErr;
  172.     
  173.     h = Get1IndResource(rType, index);
  174.     err = ResError();
  175.     if (err != noErr) return err;
  176.     if (h == nil) return resNotFound;
  177.     *(void**)theHandle = h;
  178.     return noErr;
  179. }
  180.  
  181.  
  182.  
  183. /*----------------------------------------------------------------------------
  184.     MyAddResource 
  185.     
  186.     Add a resource.
  187.             
  188.     Entry:    rType = resource type.
  189.             rID = resource id.
  190.             theHandle = handle to data.
  191.             rName = resource name.
  192.     
  193.     Exit:    function result = error code.
  194. ----------------------------------------------------------------------------*/
  195.  
  196. OSErr MyAddResource (void *theHandle, OSType rType, short rID,
  197.     ConstStr255Param rName)
  198. {
  199.     AddResource(theHandle, rType, rID, rName);
  200.     return ResError();
  201. }
  202.  
  203.  
  204.  
  205. /*----------------------------------------------------------------------------
  206.     MyReplaceResource 
  207.     
  208.     Replace a resource. Create it if it doesn't already exist.
  209.             
  210.     Entry:    theHandle = handle to data.
  211.             rType = resource type.
  212.             rID = resource id.
  213.             rName = resource name.
  214.     
  215.     Exit:    function result = error code.
  216. ----------------------------------------------------------------------------*/
  217.  
  218. OSErr MyReplaceResource (void *theHandle, OSType rType, short rID,
  219.     ConstStr255Param rName)
  220. {
  221.     OSErr err = noErr;
  222.     Handle h;
  223.  
  224.     SetResLoad(false);
  225.     err = MyGet1Resource(rType, rID, &h);
  226.     SetResLoad(true);
  227.     if (err == noErr) {
  228.         SetResInfo(h, Unique1ID(rType), nil);
  229.         err = MyAddResource(theHandle, rType, rID, rName);
  230.         if (err == noErr) {
  231.             RemoveResource(h);
  232.             MyDisposeHandle(h);
  233.             return noErr;
  234.         } else {
  235.             SetResInfo(h, rID, nil);
  236.             return err;
  237.         }
  238.     } else if (err == resNotFound) {
  239.         return MyAddResource(theHandle, rType, rID, rName);
  240.     } else {
  241.         return err;
  242.     }
  243. }
  244. /*
  245. OSErr MyReplaceResource (void *theHandle, OSType rType, short rID,
  246.     ConstStr255Param rName)
  247. {
  248.     OSErr err = noErr;
  249.     Handle h;
  250.  
  251.     SetResLoad(false);
  252.     err = MyGet1Resource(rType, rID, &h);
  253.     SetResLoad(true);
  254.     if (err == noErr) {
  255.         RemoveResource(h);
  256.         MyDisposeHandle(h);
  257.     } else if (err != resNotFound) {
  258.         return err;
  259.     }
  260.     return MyAddResource(theHandle, rType, rID, rName);
  261. }
  262. */
  263.     
  264.  
  265.  
  266. /*----------------------------------------------------------------------------
  267.     MyReleaseResource 
  268.     
  269.     Release a resource.
  270.             
  271.     Entry:    rHandle = handle to resource.
  272. ----------------------------------------------------------------------------*/
  273.  
  274. void MyReleaseResource (void *rHandle)
  275. {
  276.     ReleaseResource(rHandle);
  277. }
  278.  
  279.  
  280.  
  281. /*----------------------------------------------------------------------------
  282.     MyDetachResource 
  283.     
  284.     Detach a resource.
  285.             
  286.     Entry:    rHandle = handle to resource.
  287. ----------------------------------------------------------------------------*/
  288.  
  289. void MyDetachResource (void *rHandle)
  290. {
  291.     DetachResource(rHandle);
  292. }
  293.  
  294.  
  295.  
  296. /*----------------------------------------------------------------------------
  297.     WriteProgramNameResource 
  298.     
  299.     Write the program name resource (STR id=-16396) to the current resource
  300.     file. See IM VI p. 9-21.
  301.     
  302.     Entry:    index = index in STR# id=128 resource of program name string.
  303.     
  304.     Exit:    function result = error code.
  305. ----------------------------------------------------------------------------*/
  306.  
  307. OSErr WriteProgramNameResource (short index)
  308. {
  309.     Handle h;
  310.     Str255 progName;
  311.     OSErr err = noErr;
  312.     
  313.     GetPString(index, progName);
  314.     err = MyPtrToHand(progName, &h, *progName + 1);
  315.     if (err != noErr) return err;
  316.     return MyReplaceResource(h, 'STR ', -16396, "\p");
  317. }
  318.  
  319.  
  320.  
  321. /*----------------------------------------------------------------------------
  322.     GetVersionString 
  323.     
  324.     Get the version number string from the current resource file.
  325.     
  326.     Exit:    function result = error code.
  327.             versString = P-format version number string.
  328. ----------------------------------------------------------------------------*/
  329.  
  330. OSErr GetVersionString (Str255 versString)
  331. {
  332.     OSErr err = noErr;
  333.     Handle vers1Resource;
  334.  
  335.     err = MyGet1Resource('vers', 1, &vers1Resource);
  336.     if (err != noErr) return err;
  337.     CopyPascalString(versString, (StringPtr)(*vers1Resource+6));
  338.     return noErr;
  339. }
  340.  
  341.  
  342.  
  343. /*----------------------------------------------------------------------------
  344.     GetVersionNumber 
  345.     
  346.     Get the version number from the current resource file.
  347.     
  348.     Exit:    function result = error code.
  349.             *versNumber = version number.
  350. ----------------------------------------------------------------------------*/
  351.  
  352. OSErr GetVersionNumber (unsigned long *versNumber)
  353. {
  354.     OSErr err = noErr;
  355.     Handle vers1Resource;
  356.     
  357.     err = MyGet1Resource('vers', 1, &vers1Resource);
  358.     if (err != noErr) return err;
  359.     *versNumber = **(unsigned long**)vers1Resource;
  360.     return noErr;
  361. }
  362.  
  363.  
  364.  
  365. /*----------------------------------------------------------------------------
  366.     MyCloseResFile 
  367.     
  368.     Close a resource file.
  369.     
  370.     Entry:    fRefNum = file reference number.
  371.     
  372.     Exit:    function result = error code.
  373. ----------------------------------------------------------------------------*/
  374.  
  375. void MyCloseResFile (short fRefNum)
  376. {
  377.     short vRefNum;
  378.     OSErr err = noErr;
  379.     
  380.     err = GetFileVolRefNum(fRefNum, &vRefNum);
  381.     CloseResFile(fRefNum);
  382.     if (err == noErr) FlushVol(nil, vRefNum);
  383. }